public class DataType_Operators {
    public static void main(String[] args) {
        char c='画';//char在Java占两个字节，采用Unicode编码

        int a=10;//建议在定义变量的时候进行初始化
        long b1=20;//整数默认int类型，在定义long类型的变量时 建议 在数字后面+L/l
        long b2=3000000000L;
        //long b3=3000000000; //b3中数字后面没加 L/l 会编译报错

        float d=22.2f;//小数默认时double类型，在定义float类型的变量时，必须在数字后面加F/f，否则会编译报错
        double e=8.0;

        //运算符
        //+ - * / %
        //隐式类型转换
        //0不能作除数
        //小数取模

        //隐式类型转换
        int i1=24;
        long l1=54L;   long l2=25L;
        l1=l2+i1;//其中l1类型的数据范围比i1的大，此时i1就会自动提升为long类型（临时）

        //除(/)  0不能作除数
        //System.out.println(10/0);//抛出程序异常

        //小数取模
        System.out.println("11.5%2 = "+11.5%2);//这里的“+”不是数字之间的，而是字符串的拼接



        System.out.println("================");
        //复合运算符
        //+=  -=  *=  /=  %=
        //强制类型转换
        int i2=10;
        long l4=25L;
        i2 += l4;//Java的复合赋值运算符（如`+=`、`-=`等）会自动执行隐式的类型转换。也就是说，`i2 += l4;`实际上等同于`i2 = (int) (i2 + l4);`。这里存在一个隐式的强制转换



        //关系运算符，返回值都是布尔类型(boolean)
        //==  !=  >  <  >=  <=
        System.out.println(b2==b1);



        System.out.println("================");
        //逻辑运算符，返回值都是布尔类型(boolean)
        //&&  ||  !
        //System.out.println(1&&2);//编译报错
        System.out.println(b1==b2 && d==e);//逻辑运算符的操作数是 逻辑表达式或布尔类型的变量

        //短路
        System.out.println("e = "+e);
        System.out.println(b1==b2 && d==++e);
        System.out.println("e = "+e);//b1==b2为假，d==++e没有执行


        System.out.println("================");
        // 位运算符
        // 按位与&，按位或|，按位取反~，按位异或^

        // 按位与&，按位或|，按位取反~ 没有短路现象。当他们的操作数都为布尔类型的值时，此时与逻辑运算符的功能相似
        System.out.println("e = "+e);
        System.out.println(b1==b2 & d==++e);
        System.out.println("e = "+e);//b1==b2为假，d==++e有执行

        // 按位异或^
        System.out.println(1^1);//n^n=0，
        System.out.println(2^0);//0^n=n


        System.out.println("================");
        // 移位运算符
        // << >> >>>(无符号右移)
        System.out.println("10>>1 = "+ (10>>1));//5  如果(10>>1)不加加括号，"10>>1 = " + 10 这部分会先执行，其结果是一个字符串 "10>>1 = 10"。接着，Java 尝试对这个字符串和数字 1 使用右移运算符 >>，但右移运算符只能用于整数类型，所以就会报错。
        //右移运算符，左边补0，移n位，除2的n次方

        // >>>(无符号右移)
        int i3=-128;
        System.out.println("i3>>>1 = "+(i3>>>1));


        System.out.println("================");
        //条件运算符
        int x=2,y=3,z=5;
        System.out.println(x>y?y:z);

    }
}
